#include <iostream>
using namespace std;

#include <vector>
#include <string>

// 全特化
template <typename T>
struct MyHash
{
    size_t operator()(const T& val) const
    {
        // 通用哈希算法
        // ...
    }
};

template <>
struct MyHash<std::string>
{
    size_t operator()(const std::string& str) const
    {
        // 针对string类型特有的哈希算法
        // ...
    }
};

// 偏特化
template <typename T>
struct CheckType
{
    void Print()
    {
        cout << "Value Type..." << endl;
    }
};

template <typename T>
struct CheckType<T*>
{
    void Print()
    {
        cout << "Pointer Type..." << endl;
    }
};

// 对STL容器vector进行特化进行性能优化
template <typename Container>
void ClearContainer(Container& con)
{
    con = Container();
}

template <typename T>
void ClearContainer(std::vector<T>& vec)
{
    vec.clear();
    vec.shrink_to_fit();
}

// 利用变参模板实现一个make_shared
template <typename T>
class MySharedPtr;

template <typename T, typename ...Args>
MySharedPtr<T> my_make_shared(Args&&... args)
{
    T* ptr = new T(std::forward<Args>(args)...);
    return MySharedPtr<T>(ptr);
}

template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
doubleValue (T num)
{
    return num * 2;
}

template <std::integral T>
T doubleValue(T num)
{
    return num * 2;
}


int main()
{
    CheckType<int>().Print();
    CheckType<int*>().Print();

    return 0;
}